#!/bin/bash
# author:lixiang
# 批量混合噪音，随机取噪音文件的某一段，并把记录保存在log.txt
# channel1和channel2的数据与噪音文件混合时，随机抽取的噪音时间段保持一致
# sox版
# 使用 ./mixin_sox.sh <channel1 path> <channel2 path>


# 数据文件目录
orig_ch1_dir=$1
orig_ch2_dir=$2

log_txt="log.txt"
rm -rf ${orig_ch1_dir}_noise ${orig_ch2_dir}_noise $log_txt f.log

# 生成指定范围随机数
function rand_func(){
    min=$1
    max=$(($2-$min+1))
    num=$(date +%s%N)
    echo $(($num%$max+$min))
}

# 统计目录数量和音频文件数量
DS=0
FS=0

# 递归遍历数据目录
function mixin_func(){
    for file in `ls $1`
    do
        if [ -d $1"/"$file ]  
        then
            ((DS++))
            # echo $1"/"$file
            mkdir -p $2"/"$file
            mixin_func $1"/"$file $2"/"$file $3
        else
            # 如果是wav文件，则开始混合音频
            if [ "${file##*.}" = "wav" ]; then
                ((FS++))
                # 获取当前音频文件时长
                d_file_duration=`soxi -D $1"/"$file`
                # 随机取噪音文件的某一段
                if [ "$3" == "false" ]
                then
                    param=`echo "$n_file_duration $d_file_duration" | awk '{printf ("%.0f\n",$1-$2)}'`
                    rnd=$(rand_func 1  $param)
                    echo $rnd $d_file_duration $1"/"$file >> $log_txt 
                fi
                # 获取log文件中对应行的内容
                start_time=`cat $log_txt|sed -n ${FS}p|awk -F ' ' '{print $1}'`
                # 混合音频
                sox -m -v1 $1"/"$file -v1 "| sox $noise_path -p trim $start_time $d_file_duration" $2"/"$file
                echo $? $1"/"$file
                echo [`date '+%Y-%m-%d %H:%M:%S'`] $? sox -m -v1 $1"/"$file -v1 "| sox $noise_path -p trim $start_time $d_file_duration" $2"/"$file >> f.log
            fi
        fi
    done
}

# 调用方法，开始处理音频
# channel 1
noise_path="noise/ch1.wav"

# 噪音文件时长
n_file_duration=`soxi -D $noise_path`

mixin_func $orig_ch1_dir ${orig_ch1_dir}_noise false
echo "channel 1 ok"
echo "${DS} dictories,${FS} files"

DS=0
FS=0
# channel 2
noise_path="noise/ch2.wav"

# 噪音文件时长
n_file_duration=`soxi -D $noise_path`

mixin_func $orig_ch2_dir ${orig_ch2_dir}_noise true
echo "channel 2 ok"
echo "${DS} dictories,${FS} files"
